package org.example.rowing;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import lombok.extern.slf4j.Slf4j;
import org.example.rowing.controller.util.NavigationUtil;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * 配置 JavaFX 启动类
 * Spring Boot 本身并不直接支持启动 JavaFX 应用程序，所以编写一个启动类，用于启动 JavaFX 应用。
 * 这个类将作为应用程序的入口点，并且可以在其中初始化 Spring Boot 上下文。
 */
@Slf4j
@SpringBootApplication
public class JavaFxApp extends Application {

    private ConfigurableApplicationContext context;

    public static void main(String[] args) {
        // 启动 spring boot应用并启动 Javafx应用
        launch(args);
    }

    @Override
    public void init() throws Exception {
        super.init();
        // 初始化spring boot上下文
        context = new SpringApplicationBuilder(JavaFxApp.class).run();
        log.info("init...");
        initDatabase();
        NavigationUtil.setApplicationContext(context);
    }

    @Override
    public void start(Stage stage) throws IOException {
        // 创建JavaFx界面
        log.info("准备加载JavaFx");
        try {
            URL url = getClass().getResource("/fxml/LoginView.fxml");
            log.info("LoginView.fxml URL = {}", url);
            FXMLLoader fxmlLoader = new FXMLLoader(url);
            fxmlLoader.setControllerFactory(context::getBean);
            Parent root = fxmlLoader.load();
            Scene scene = new Scene(root);

            // 设置窗口图标（支持多分辨率）
            Image appIcon = new Image(getClass().getResourceAsStream("/image/app-icon.png"));
            stage.getIcons().add(appIcon);

            stage.setScene(scene);
            stage.setTitle("赛艇赛事管理系统");

            // 设置初始窗口大小
            stage.setWidth(1280);
            stage.setHeight(860);

            // 设置最小窗口大小
            stage.setMinWidth(800);
            stage.setMinHeight(600);

            stage.show();
            log.info("start...");
        } catch (Throwable throwable) {
            log.error("加载 LoginView.fxml 失败", throwable);
            Platform.exit();
        }
    }

    @Override
    public void stop() throws Exception {
        super.stop();
        context.close();
        log.info("stop...");
    }

    public void initDatabase() {
        // 在当前工作目录下查找数据库文件
        Path dbPath = Paths.get("rowing.db");
        if (Files.notExists(dbPath)) {
            // 如果不存在，则从 jar 资源中提取数据库
            try (InputStream is = JavaFxApp.class.getResourceAsStream("/db/rowing.db")) {
                if (is == null) {
                    throw new IOException("默认数据库资源未找到，请确保在 jar 内存在 /db/rowing.db 文件！");
                }
                Files.copy(is, dbPath);
                System.out.println("数据库文件已提取到：" + dbPath.toAbsolutePath());
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("数据库文件已存在：" + dbPath.toAbsolutePath());
        }
    }
}
